"ui";
var 配置 = storages.create("DSJL");
var version = 4.1;   //版本号
ui.layout(
    <ScrollView>
        <vertical>
            <appbar>
                <toolbar id="bt" title="抖商精灵" />
            </appbar>
            <Switch id="autoService" text="无障碍服务" checked="{{auto.service != null}}" padding="8 8 8 8" textSize="15sp" />
            <horizontal>
                <text text="  抖音客户端：" gravity="left" />
                <spinner id="khd" entries="抖音短视频|抖音极速版" />
            </horizontal>
            <horizontal>
                <text text="  运行总时间：" gravity="left" />
                <input id="yhsc" hint="时间(分钟)" textSize="15sp" inputType="number" gravity="center" />
                <text text="    喜欢概率：" gravity="left" />
                <input id="xhgl" hint="喜欢概率" textSize="15sp" inputType="number" gravity="center" />
            </horizontal>
            <horizontal>
                <text text="  浏览作品时间：" gravity="left" />
                <input id="jg" hint="最小值" textSize="15sp" inputType="number" gravity="center" />
                <text text="----" gravity="center" />
                <input id="jg1" hint="最大值" textSize="15sp" inputType="number" gravity="center" />
                <text text="   秒" gravity="left" />
            </horizontal>
            <horizontal>
                <text text="  作品关键词：" gravity="left" />
                <input id="key" hint="务必填写，不填写无法运行！" textSize="15sp" />
            </horizontal>
            <text text="   温馨提示：" gravity="left" />
            <text text="   1.软件根据关键词识别作品是否浏览；" gravity="left" />
            <text text="   2.关键词尽量精准，才能使账号更加垂直；" gravity="left" />
            <text text="   3.可设置多个关键词，分隔符“,”；" gravity="left" />
            <text text="   4.例如：剪辑,影视,观影,60帧等；" gravity="left" />
            <text text="   5.关键词尽可能多而精准；" gravity="left" />
            <horizontal>
                <text text="   系统提示：" gravity="left" />
                <checkbox id="支持" text="本软件无需root权限。" checked="true" />
            </horizontal>

            <horizontal>
                <text id="ver" text="   当前软件版本：  " gravity="left" />
                <text id="安卓版本" textSize="15sp" />
            </horizontal>
            <horizontal>
                <button id="start" text="开始运行" layout_weight="1" style="Widget.AppCompat.Button.Colored" />
            </horizontal>

        </vertical>
    </ScrollView>
);
ui.安卓版本.text("   本机安卓版本：" + device.release + "");
ui.ver.text("   当前软件版本：" + version + "     ");
ui.bt.title = "抖商精灵 V" + version;
ui.autoService.on("check", function (checked) {
    if (checked && auto.service == null) {
        app.startActivity({
            action: "android.settings.ACCESSIBILITY_SETTINGS"
        });
    }
    if (!checked && auto.service != null) {
        auto.service.disableSelf();
    }
});




var 悬块 = function (window, view) {
    if (!window || !view) {
        throw "缺参数";
    };
    this.x = 0, this.y = 0;
    this.windowX, this.windowY;
    this.downTime = 500;
    this.Timeout = 0;
    this.Click = function () { };
    this.LongClick = function () { };
    this.setClick = function (fun) {
        //判断参数类型是否为函数？
        if (typeof fun == "function") {
            this.Click = fun;
        };
    };
    this.setLongClick = function (fun, ji) {
        //判断参数类型是否为函数？
        if (typeof fun == "function") {
            this.LongClick = fun;
            //判断参数是否可为设置数字？
            if (parseInt(ji) <= 1000) {
                this.downTime = parseInt(ji);
            };
        };
    };

    view.setOnTouchListener(new android.view.View.OnTouchListener((view, event) => {
        switch (event.getAction()) {
            //按下事件。
            case event.ACTION_DOWN:
                //按下记录各种坐标数据。
                this.x = event.getRawX();
                this.y = event.getRawY();
                this.windowX = window.getX();
                this.windowY = window.getY();
                //创建一个定时器用来定时执行长按操作。
                this.Timeout = setTimeout(() => {
                    this.LongClick();
                    this.Timeout = 0;
                }, this.downTime);
                return true;
            //移动事件。
            case event.ACTION_MOVE:
                //移动距离过大则判断为移动状态
                // if (Math.abs(event.getRawY() - this.y) > 5 && Math.abs(event.getRawX() - this.x) > 5) {
                //     //移动状态清除定时器
                //     if (this.Timeout) {
                //         //定时器存在则清除定时器。
                //         clearTimeout(this.Timeout);
                //         this.Timeout = 0;
                //     };
                //     //移动手指时调整悬浮窗位置
                //     window.setPosition(this.windowX + (event.getRawX() - this.x), this.windowY + (event.getRawY() - this.y));
                // };
                return true;
            //抬起事件。
            case event.ACTION_UP:
                if (this.Timeout) {
                    clearTimeout(this.Timeout);
                    this.Timeout = 0;
                    this.Click();
                };
                return true;
        };
        return true;
    }));
};
var startime = Date.parse(new Date());
var 点赞数量 = 0;
var 浏览数量 = 0;
readconfig();//读取配置

ui.start.on("click", function () {
    //程序开始运行之前判断无障碍服务
    if (auto.service == null) {
        toast("请先开启无障碍服务！");
        return;
    }
    saveconfig();//保存配置
    xf();//悬浮窗
    抖音();//主线程
});



function 抖音() {
    主线程 = threads.start(function () {
        console.setTitle("抖商");
        console.show();
        ts("执行操作：脚本开始运行");
        gjcjc();
        返回首页();
        sleep(1000);
        _养号()
    })
}
function xf() {
    var thread = threads.start(function op() {
        var window = floaty.window(
            // <button id="but" w="35" h="60" text="停止" />
            <button id="but" text="stop" />
            // <img id="but" src="file://stop1.png" />
        );
        window.setPosition(10, device.height / 3)
        setInterval(() => { }, 500);
        var ad = new 悬块(window, window.but);
        ad.setLongClick(function () {
            var yxtime = (Date.parse(new Date()) - startime) / 1000;
            yxtime = formatSeconds(yxtime);
            log("提示：用户停止运行");
            log("时间提示：运行" + yxtime);
            log("浏览作品：" + 浏览数量);
            log("点赞作品：" + 点赞数量);
            exit();
        });
        ad.setClick(function () {
            var yxtime = (Date.parse(new Date()) - startime) / 1000;
            yxtime = formatSeconds(yxtime);
            log("提示：用户停止运行");
            log("时间提示：运行" + yxtime);
            log("浏览作品：" + 浏览数量);
            log("点赞作品：" + 点赞数量);
            exit();
        })
    })
    //创建一个新的悬浮控制模块 ad 并带入参数(所要控制的悬浮窗和用来控制悬浮窗移动的控件)。

}
function gjcjc() {
    var keyword = ui.key.text();
    var str = keyword.split(',');
    if (str.length <= 1) {
        var str = keyword.split('，');
    }
    log("关键词数量：" + str.length);
    for (k = 0; k < str.length; k++) {
        log("关键词" + (k + 1) + ":" + str[k]);
    }
}
function saveconfig() {
    配置.put("xhgl", ui.xhgl.text());
    配置.put("jg", ui.jg.text());
    配置.put("jg1", ui.jg1.text());
    配置.put("key", ui.key.text());
    配置.put("yhsc", ui.yhsc.text());
    配置.put("支持", ui.支持.checked);
    配置.put("khd", ui.khd.getSelectedItemPosition());
}
function readconfig() {
    ui.xhgl.text(配置.get("xhgl", "60"));
    ui.jg.text(配置.get("jg", "20"));
    ui.jg1.text(配置.get("jg1", "45"));
    ui.yhsc.text(配置.get("yhsc", "30"));
    ui.支持.checked = Boolean(配置.get("支持", true));
    ui.key.text(配置.get("key", ""));
    if (parseInt(配置.get("khd", ""))) {
        ui.khd.setSelection(parseInt(配置.get("khd", "")));
    };
}
function _视频检测() {
    var h = device.height;
    var keyword = ui.key.text();
    var jstime = new Date().getTime();
    if (!text("推荐").visibleToUser().exists()) {
        返回首页();
    }
    if (text("评论并转发").visibleToUser().exists()) {
        back();
        sleep(1000);
    }
    var uc = textMatches("......*").visibleToUser().boundsInside(0, device.height / 2, device.width, device.height).find();
    for (i = 0; i < uc.length; i++) {
        if (uc[i].text() == "点击进入直播间") {
            log("直播中，自动跳过");
            log("检测耗时：" + (new Date().getTime() - jstime) + "毫秒");
            return false;
        }
    }
    for (i = 0; i < uc.length; i++) {
        if (uc[i].text().indexOf("[t]") != -1) {
            log("广告作品，自动跳过");
            log("检测耗时：" + (new Date().getTime() - jstime) + "毫秒");
            return false;
        }
    }
    for (i = 0; i < uc.length; i++) {
        var str = keyword.split(',');
        if (str.length <= 1) {
            var str = keyword.split('，');
        }
        for (k = 0; k < str.length; k++) {
            if (uc[i].text().indexOf(str[k]) != -1) {
                log("检测成功，视频符合");
                浏览数量 = 浏览数量 + 1;
                log(uc[i].text());
                log("关键词：" + str[k]);
                log("检测耗时：" + (new Date().getTime() - jstime) + "毫秒");
                return true;
            }
        }
    }
    log("跳过！当前视频不包含关键词");
    log("检测耗时：" + (new Date().getTime() - jstime) + "毫秒");
    return false;
}
function _养号() {
    var W = device.width;
    var H = device.height;
    var mt = Date.parse(new Date());
    返回首页();
    if (配置.get("key", "") == "") {
        ts("系统提示：没有添加关键词。");
        ts("系统提示：请添加后重试！");
        exit();
    }
    while (true) {
        if (_视频检测()) {
            var sj = random(parseInt(ui.jg.text()), parseInt(ui.jg1.text()));
            if (!isNaN(sj)) {
                ts("浏览时间：" + sj + "秒");
                sleep(sj * 1000);
            } else {
                ts("浏览时间：15秒");
                sleep(15 * 1000);
            }
            var sjs = random(1, 100);
            if (parseInt(ui.xhgl.text()) > sjs) {
                click(W / 2, H / 2);
                sleep(50);
                click(W / 2, H / 2);
                sleep(1000);
                点赞数量 = 点赞数量 + 1;
                log("系统提示：点赞数量：" + 点赞数量);
                // if (sjs > 39) {
                //     评论();
                // }
            }
        };
        swipe(W / 2, H * 4 / 5, W / 2, H / 6, random(300, 1000));
        sleep(random(500, 2000));
        if (textMatches("编辑资料.*|.*更多主播").exists()) {
            返回首页();
        };
        if (!text("推荐").visibleToUser().exists()) {
            返回首页();
        }
        if (text("评论并转发").visibleToUser().exists()) {
            back();
            sleep(1000);
        }
        if (Date.parse(new Date()) - mt > 1000 * 60 * parseInt(配置.get("yhsc", ""))) {
            ts("系统提示：养号结束。");
            var yxtime = (Date.parse(new Date()) - startime) / 1000;
            yxtime = formatSeconds(yxtime);
            log("时间提示：运行" + yxtime);
            log("浏览作品：" + 浏览数量);
            log("点赞作品：" + 点赞数量);
            return;
        }
        _弹窗();
        sleep(100);
    }
};
function _弹窗() {
    if (text("我知道了").exists()) {
        text("我知道了").findOne().click();
    }
    if (text("允许").exists()) {
        text("允许").findOne().click();
    }
    if (text("取消").exists()) {
        text("取消").findOne().click();
    }
    if (text("以后再说").exists()) {
        text("以后再说").findOne().click();
    }
    if (text("继续播放").exists()) {
        text("继续播放").findOne().click();
    }
    if (text("好的").exists()) {
        text("好的").findOne().click();
    }
}
function _判断是否登录() {
    返回首页();
    while (true) {
        _弹窗()
        if (text("我").exists()) {
            var b = text("我").findOne().bounds();
            if (b) {
                click(b.centerX(), b.centerY());
                sleep(1000);
            };
        };
        if (text("编辑资料").exists() || text("分享主页").exists() || text("编辑企业资料").exists()) {
            ts("操作提示：账号已登录")
            return true;
        };
        if (text("密码登录").exists()) {
            ts("操作提示：账号未登录");
            return false;
        };
        if (text("您的收藏在这里").exists()) {
            back();
            sleep(1000);
        };
        sleep(100);
    }
};
function 返回首页() {
    if (parseInt(配置.get("khd", "")) == 1) {
        app.startActivity({
            action: "android.intent.action.VIEW",
            data: "snssdk2329://feed"
        });
    } else {
        app.startActivity({
            action: "android.intent.action.VIEW",
            data: "snssdk1128://feed"
        });
    }
    sleep(100);
}
function ts(text) {
    log(text)
}
function formatSeconds(value) {
    var secondTime = parseInt(value);// 秒
    var minuteTime = 0;// 分
    var hourTime = 0;// 小时
    if (secondTime > 60) {
        minuteTime = parseInt(secondTime / 60);
        secondTime = parseInt(secondTime % 60);
        if (minuteTime > 60) {
            hourTime = parseInt(minuteTime / 60);
            minuteTime = parseInt(minuteTime % 60);
        }
    }
    var result = "" + parseInt(secondTime) + "秒";

    if (minuteTime > 0) {
        result = "" + parseInt(minuteTime) + "分" + result;
    }
    if (hourTime > 0) {
        result = "" + parseInt(hourTime) + "小时" + result;
    }
    return result;
}
function download(url, filePath) {
    importClass('java.io.FileOutputStream');
    importClass('java.io.IOException');
    importClass('java.io.InputStream');
    importClass('java.net.MalformedURLException');
    importClass('java.net.URL');
    importClass('java.net.URLConnection');
    importClass('java.util.ArrayList');

    var url = new URL(url);
    var conn = url.openConnection(); //URLConnection
    var inStream = conn.getInputStream(); //InputStream
    var fs = new FileOutputStream(filePath); //FileOutputStream
    var connLength = conn.getContentLength(); //int
    var buffer = util.java.array('byte', 1024); //byte[]
    var byteSum = 0; //总共读取的文件大小
    var byteRead; //每次读取的byte数
    // log('要下载的文件大小=');
    // log(connLength);
    var threadId = threads.start(function () {
        while (1) {
            var 当前写入的文件大小 = byteSum;
            var progress = (当前写入的文件大小 / connLength) * 100;
            if (progress > 0.1) {
                //var progress = parseInt(progress).toString() + '%';
                // ui.run(function () {
                //     w.progressNum.setText(progress);
                // });
                if (当前写入的文件大小 >= connLength) {
                    break;
                }
            }
            sleep(1000);
        }
    });
    while ((byteRead = inStream.read(buffer)) != -1) {
        byteSum += byteRead;
        //当前时间
        currentTime = java.lang.System.currentTimeMillis();
        fs.write(buffer, 0, byteRead); //读取
    }
    threadId && threadId.isAlive() && threadId.interrupt();
}
function 评论() {
    if (descStartsWith("评论").exists()) {
        var uc = descStartsWith("评论").find();
        for (i = 0; i < uc.length; i++) {
            if (uc[i].bounds().centerX() > 0 && uc[i].bounds().centerY() > 0 && uc[i].bounds().centerY() < device.height) {
                uc[i].click();
                //click(uc[i].bounds().centerX(), uc[i].bounds().centerY())
                sleep(2000);
                break;
            }
        }
    }
    if (textStartsWith("留下你的精彩评论").exists()) {
        if (!desc("[呲牙]").exists()) {
            log("操作提示：浏览评论");
            var a = "";

            var uc1 = textMatches(".+分.*钟.*前.*|.*小时前").visibleToUser(true).findOne(1000)
            if (uc1) {
                a = uc1.text();
                a = a.replace(/[0-9]/ig, "");
                a = 取文本左边(a, "前");
            }
            var num = random(2, 4)
            for (i = 0; i < num; i++) {
                var sjs = random(2, 5);
                swipe(device.width / 2, device.height - 260, device.width / 2, device.height / sjs, random(500, 2000))
                var sj = random(3, 7);
                sleep(sj * 1000);
            }
            if (uc1) {
                if (textStartsWith("留下你的精彩评论").exists()) {
                    textStartsWith("留下你的精彩评论").findOne().click();
                    sleep(1000);
                    if (setText(a)) {
                        sleep(1000);
                    }
                    if (desc("表情").exists()) {
                        var td = desc("表情").findOne().bounds();
                        click(td.right + 40, td.centerY());
                        sleep(2000);
                        log("操作提示：评论内容：" + a);
                    }
                }
            }
            var num = random(2, 4)
            for (i = 0; i < num; i++) {
                var sjs = random(2, 5);
                swipe(device.width / 2, device.height - 260, device.width / 2, device.height / sjs, random(500, 2000))
                var sj = random(3, 7);
                sleep(sj * 1000);
            }
        }
        else {
            back();
            sleep(2000);
        }

        back();
        sleep(2000);
    }
    app.startActivity({
        action: "android.intent.action.VIEW",
        data: "snssdk1128://feed"
    });
    sleep(1000);
}
function 取文本左边(str, a)  //取文本的中间值
{
    var w1 = str.indexOf(a);
    if (w1 < 0) {
        return false;
    };
    return str.substr(0, w1 - a.length - 2);
}
function sjstr(str) //返回一个随机值,分隔符,
{
    if (str) {
        strnum = str.split(",");
        if (strnum.length <= 1) {
            var strnum = str.split('，');
        }
        var sjz = random(0, parseInt(strnum.length) - 1);
        return strnum[sjz];
    }
}